%wieviele v�ter hat bob?
%wer ist der vater von bob?
%welchen vater hat bob?
%hat bob einen vater?

%s -> FP NP [VP] NP
%S -> FP NP PP

%NP -> [Artikel] Nomen
%VP -> Verb
%VP -> Pr�position

%PP -> Pr�position NP

%Fragephrase -> wie viele, wer ist, welchen, hat
%Fragephrase -> Fragewort [Bindwort]

%
% Struktur: wort, semantik, wortart, numerus, artikel
%
lex(vater, vater, n, sg, der).
lex(vaeter, vater, n, pl, die).
lex(mutter, mutter, n, sg, die).
lex(muetter, mutter, n, pl, die).
lex(sohn, sohn, n, sg, der).
lex(soehne, sohn, n, pl, die).
lex(tochter, tochter, n, sg, die).
lex(toechter, tochter, n, pl, die).
lex(kind, kind, n, sg, das).
lex(kinder, kind, n, pl, die).
lex(bruder, bruder, n, sg, der).
lex(brueder, bruder, n, pl, die).
lex(schwester, schwester, n, sg, die).
lex(schwestern, schwester, n, pl, die).
lex(onkel, onkel, n, sg, der).
lex(onkel, onkel, n, pl, die).
lex(tante, tante, n, sg, die).
lex(tanten, tante, n, pl, die).
lex(cousin, cousin, n, sg, der).
lex(cousins, cousin, n, pl, die).
lex(halbschwester, halbschwester, n, sg, die).
lex(halbschwestern, halbschwester, n, pl, die).


lex(keinen, kein, _, _, der).
lex(keine, kein, _, _, die).
lex(kein, kein, _, _, das).

lex(der, _, art, sg, _).
lex(die, _, art, _, _).
lex(das, _, art, sg, _).
lex(ein, _, art, sg, _).
lex(einen, _, art, sg, _).
lex(eine, _, art, sg, _).

lex(hat, hat, v, sg, _).
lex(haben, hat, v, pl, _).

lex(viele, _, b, _, _).

lex(X, X, n, sg, _) :- kind(X, _).
lex(X, X, n, sg, _) :- vater(X, _).
lex(X, X, n, sg, _) :- mutter(X, _).

lex(von, _, p, _, _).

%lex(wie, wieviele, fw, _, _). %weil (wie viele) auseinander geschrieben wird (wie viele ... hat ...)
lex(wer, wer, fw, _, _). %wer ist ... von ...
lex(welchen, welchen, fw, _, _). %welchen ... hat ...?
%lex(hat, hat, v, _, _). %hat ... einen ...?
lex(ist, ist, v, _, _). %ist ... der/die/das ... von ...

%
% Logik
%

wer(Relation, Zweitparameter) :- Funktor =.. [Relation, X, Zweitparameter], Funktor, 
                                                                 lex(_, Relation, _, _, Artikel), 
                                                                 concat_atom([X, ist, Artikel, Relation, von, Zweitparameter], ' ', Satz), write(Satz).
wer(Relation, Zweitparameter) :- lex(_, Relation, _, _, Artikel), 
                                                                 lex(Kein, kein, _, _, Artikel), 
                                                                 concat_atom([Zweitparameter, hat, Kein, Relation, '!'], ' ', Satz), write(Satz).  

welchen(Relation, Zweitparameter) :- wer(Relation, Zweitparameter).

hat(Relation, Zweitparameter) :- Funktor =.. [Relation, _, Zweitparameter], Funktor,
                                                                 write(ja).
hat(_, _) :- write(nein).

ist(Relation, ErstParam, ZweitParam) :- Funktor =.. [Relation, ErstParam, ZweitParam], Funktor,
                                                                                write(ja).
ist(_, _, _) :- write(nein).

abfrage :- write('Abfrage: '),
                   read_sentence(Satz),
                   satz(Sem, Satz, []),
                   Sem, !. %Der Cut dient zum Vermeiden von weiteren Antworten mit ';' (Magic)

%
% Ende-Logik
%

%satz(Sem) --> fp(SemFP, SemBinde), np(SemNP), vp, np(SemNP2), fragezeichen, { Sem =.. [SemFP, SemNP, SemBinde, SemNP2] }.
%satz(Sem) --> fp(SemFP, SemBinde), np(SemNP), np(SemNP2), fragezeichen, { Sem =.. [SemFP, SemNP, SemBinde, SemNP2] }.
%satz(Sem) --> fp(SemFP, SemBinde), np(SemNP), pp(SemPP), fragezeichen, { Sem =.. [SemFP, SemNP, SemBinde, SemPP] }.

%np(SemNP) --> nomen(SemNP, _).
%np(SemNP) --> artikel(N), nomen(SemNP, N).

artikel(N) --> [X], {lex(X, _, art, N, _)}.
nomen(SemNP, N) --> [X], {lex(X, SemNP, n, N, _)}. 

%vp --> verb.
%verb --> [X], {lex(X, _, v, _, _)}.

pp(SemPP) --> praeposition, np(SemPP).
praeposition --> [X], {lex(X, _, p, _, _)}.

%fp(SemFW, _) --> fw(SemFW).
%fp(SemFW, SemBinde) --> fw(SemFW), bindewort(SemBinde).

fragezeichen --> [X], {X == '?'}.
%bindewort(Sem) --> [X], {lex(X, Sem,_,_,_)}.

fw([SemFW]) --> [X], {lex(X, SemFW, fw, _, _)}.


%%Grammatik2
satz(Sem) --> vp(SemVP), np(SemNP), np(SemNP2), fragezeichen, {append(SemVP, SemNP, X), append(X, SemNP2, Liste),
              append([Fun, Obj1, Rel], Rest, Liste), Sem =.. [Fun, Rel, Obj1 | Rest] }.
satz(Sem) --> fw(SemFW), vp(SemVP), fragezeichen, {append(SemFW, SemVP, Liste), Sem =.. Liste}.
satz(Sem) --> fw(SemFW), np(SemNP), vp(SemVP), fragezeichen, { append(SemFW, SemNP, X), append(X, SemVP, Liste), Sem =.. Liste }.

vp([SemVP]) --> verb(SemVP).
vp(SemVP) --> verb(_), np(SemVP).

np([SemNP]) --> artikel(N), nomen(SemNP, N).
np([SemNP]) --> nomen(SemNP, _).
np([SemNP|SemPP]) --> artikel(N), nomen(SemNP, N), pp(SemPP).

verb(SemV) --> [X], {lex(X, SemV, v, _,_)}.


